/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package apunte;

import dataBase.Db;
import eliminar.eliminarApunte;
import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.LinkedList;
import javax.swing.JOptionPane;

/**
 *
 * @author martinLeq1uerica
 */
public class ManejoApunte implements Serializable {

    private Db db;
    private LinkedList<Apunte> ap;
    private Profesor pr;
    private Materia mat;
    private String sql;
    private java.sql.Statement st;

    public ManejoApunte() {

        db = new Db();
        java.sql.Statement st = db.getStatement();

    }

    public LinkedList<Apunte> getAllApuntes() throws SQLException {

        st = db.getStatement();
        ap = new LinkedList();

        sql = "select * from apunte inner join materia on apunte.materia_idmateria = materia.idmateria";
        ResultSet eq = st.executeQuery(sql);

        while (eq.next()) {
            ap.add(new Apunte(eq.getInt("idapunte"), eq.getString("nombreApunte"), eq.getString("tema"), eq.getString("letra"), eq.getString("anio"), eq.getInt("cantidad"), eq.getString("ubicacion"), eq.getString("precio"), eq.getString("descripcion"), eq.getString("tags"), new Materia(eq.getInt("idmateria"), eq.getString("nombreMateria"), eq.getString("jefeDeCatedra"))));

        }




        for (int i = 0; i < ap.size(); i++) {

            eq = st.executeQuery("select * from profesor_has_apunte pha, profesor p where pha.apunte_identificador = " + ap.get(i).getIdapunte() + " and pha.profesor_idprofesor = p.idprofesor ");
            while (eq.next()) {

                ap.get(i).setProfesor(new Profesor(eq.getInt("idprofesor"), eq.getString("nombreProfesor"), eq.getString("apellido"), eq.getString("mail"), eq.getString("direccion"), eq.getInt("telefono")));
            }

        }

        for (int i = 0; i < ap.size(); i++) {


            eq = st.executeQuery("select * from carrera_has_apunte cha, carrera c where cha.apunte_identificador = " + ap.get(i).getIdapunte() + " and cha.carrera_idcarrera = c.idcarrera ");

            while (eq.next()) {

                ap.get(i).setCarrera(new Carrera(eq.getInt("idcarrera"), eq.getString("nombreCarrera"), eq.getString("jefeDeDepartamento")));


            }

        }



        return ap;



    }

    public void guardarApunte(Apunte ap) throws SQLException {

        st = db.getStatement();


        String sql = "insert into apunte (idapunte,nombreApunte,tema,letra,anio,cantidad,ubicacion,precio,descripcion,materia_idmateria,tags) values ( " + null + ",'" + ap.getNombreApunte() + "','" + ap.getTema() + "','" + ap.getLetra() + "','" + ap.getAnio() + "','" + ap.getCantidad() + "','" + ap.getUbicacion() + "','" + ap.getPrecio() + "','" + ap.getDescripcion() + "','" + ap.getMateria().getIdmateria() + "','" + ap.getTags() + "')";
        
        System.out.println(sql);
        st.execute(sql);
        ResultSet generatedKeys = st.executeQuery("select last_insert_id()");
        generatedKeys.next();
        int id = generatedKeys.getInt(1);
        LinkedList<Carrera> carrera = ap.getCarrera();

        Iterator<Carrera> i = carrera.iterator();

        while (i.hasNext()) {
            Carrera next = i.next();


            sql = "insert into carrera_has_apunte (carrera_idcarrera,apunte_identificador) values ( " + next.getIdcarrera() + "," +id+ " )  ";
            st.execute(sql);
        }
        LinkedList<Profesor> profesor = ap.getProfesor();
        Iterator<Profesor> iter = profesor.iterator();

        while (iter.hasNext()) {
            Profesor next = iter.next();
            st =db.getStatement();
            sql = "insert into profesor_has_apunte (profesor_idprofesor,apunte_identificador) values ( " + next.getIdprofesor() + "," +id+ " )  ";
            st.execute(sql);
        }


    }

    public void guardarApuntes(LinkedList<Apunte> ap) throws SQLException {
        st = db.getStatement();

        Iterator<Apunte> i = ap.iterator();





        while (i.hasNext()) {
            Apunte next = i.next();

            String sql = "insert into apunte values ( " + null + ",'" + next.getNombreApunte() + "','" + next.getTema() + "','" + next.getLetra() + "','" + next.getAnio() + "','" + next.getCantidad() + "','" + next.getUbicacion() + "','" + next.getPrecio() + "','" + next.getDescripcion() + "','" + next.getMateria().getIdmateria() + "','" + next.getTags() + "')";
            System.out.println(sql);
            //ejecuto la consulta
            st.execute(sql);
            //traigo el ultimo id insertado en apunte

            ResultSet generatedKeys = st.getGeneratedKeys();
            generatedKeys.next();
            //traigo la linked list de prfesores
            LinkedList<Profesor> pr = next.getProfesor();
            //recorro la linked list e inserto todos los id en la tabla traspuesta de profesores
            for (int k = 0; k < pr.size(); k++) {
                Profesor get = pr.get(k);

                sql = "insert into profesor_has_apunte values ( " + get.getIdprofesor() + "," + generatedKeys.getInt(1) + " )  ";

                st.execute(sql);


            }

            //traigo la linked list de carrera
            LinkedList<Carrera> carrera = next.getCarrera();

            for (int k = 0; k < carrera.size(); k++) {
                Carrera get = carrera.get(k);
                sql = "insert into profesor_has_apunte values ( " + get.getIdcarrera() + "," + generatedKeys + " )  ";
                st.execute(sql);
            }





        }

        JOptionPane.showMessageDialog(null, "Se guardo con exito en la base de datos");


    }

    public void guardarProfesor(String[] profe) throws SQLException {

        Profesor pr = new Profesor(profe);
        st = db.getStatement();
        String sql = "Insert into profesor (idprofesor,nombreProfesor,apellido,mail,direccion,telefono) values (" + null + ",'" + pr.getNombre() + "','" + pr.getApellido() + "','" + pr.getMail() + "','" + pr.getDireccion() + "','" + pr.getTelefono() + "') ";
        System.out.println(sql);
        st.execute(sql);




    }

    public void guardarCarrera(Carrera ca) throws SQLException {
        st = db.getStatement();
        String sql = "insert into carrera (idcarrera,nombreCarrera,jefeDeDepartamento) values (" + null + ",'" + ca.getNombreCarrera() + "','" + ca.getJefeDeDepartamento() + "')";
        st.execute(sql);

    }

    public void guardarMateria(Materia ma) throws SQLException {
        st = db.getStatement();

        String sql = "insert into materia (idmateria,nombreMateria,jefeDeCatedra) values (" + null + ",'" + ma.getNombreMateria() + "','" + ma.getJefeDeCatedra() + "')";
        st.execute(sql);
    }

    public LinkedList<Profesor> traerProfesores() throws SQLException {

        st = db.getStatement();
        LinkedList<Profesor> llp = new LinkedList();


        String sql = "select * from profesor order by idprofesor";
        ResultSet eq = st.executeQuery(sql);



        while (eq.next()) {

            llp.add(new Profesor(eq, 1));

        }

        return llp;



    }

    public LinkedList<Carrera> traerCarreras() throws SQLException {

        LinkedList<Carrera> llc = new LinkedList();

        st = db.getStatement();

        String sql = "select * from carrera  order by idcarrera";
        ResultSet eq = st.executeQuery(sql);

        while (eq.next()) {


            llc.add(new Carrera(eq, 1));

        }
        return llc;


    }

    public void eliminarApunte(Apunte ap) throws SQLException {

        st = db.getStatement();
        JOptionPane.showMessageDialog(null, ap.getIdapunte());
        String sql = " delete from profesor_has_apunte where profesor_has_apunte.apunte_identificador = " + ap.getIdapunte() + " ";
        st.execute(sql);
        sql = "delete from carrera_has_apunte where carrera_has_apunte.apunte_identificador = " + ap.getIdapunte() + " ";
        st.execute(sql);
        
        //esta linea hay que sacarla
        sql = " delete from ventas_has_apunte where ventas_has_apunte.apunte_idapunte = " + ap.getIdapunte() + " ";
        st.execute(sql);
        sql = " delete from apunte where apunte.idapunte = " + ap.getIdapunte() + " ";
        st.execute(sql);
        


    }

    public boolean verificoDependenciasCarrera(Carrera ca) throws SQLException {
        st = db.getStatement();
        String sql = "select * from carrera_has_apunte where carrera_has_apunte.carrera_idcarrera = " + ca.getIdcarrera() + "  ";
        System.out.println(sql);
        ResultSet eq = st.executeQuery(sql);



        if (eq.next() == true) {
            int dialog = JOptionPane.showConfirmDialog(null, "Esta carrera contiende dependencias y no puede ser borrada, desea ver las dependencias ?");

            switch (dialog) {

                case 0:

                    verDependenciasCarrera(ca);

                    break;
                case 1:
                    break;
                case 2:
                    break;

            }



            return true;

        } else {


            return false;
        }


    }

    public void eliminarCarrera(Carrera ca) throws SQLException {
        st = db.getStatement();
        String sql = "delete from carrera where idcarrera = " + ca.getIdcarrera() + " ";
        st.execute(sql);

    }

    private void verDependenciasCarrera(Carrera ca) throws SQLException {
        st = db.getStatement();

        String sql = "select * from carrera_has_apunte cha,apunte ap where cha.carrera_idcarrera = " + ca.getIdcarrera() + " and cha.apunte_identificador = ap.`idapunte`";
        ResultSet eq = st.executeQuery(sql);
        String resultado = "";
        LinkedList<Apunte> llc = new LinkedList();



        while (eq.next()) {

            llc.add(new Apunte(eq, 1));

        }

        new eliminarApunte(llc);







    }

    //METODOS MATERIA
    public LinkedList<Materia> traerMaterias() throws SQLException {


        LinkedList<Materia> llm = new LinkedList();
        st = db.getStatement();
        String sql = "select * from materia order by idmateria";
        ResultSet eq = st.executeQuery(sql);

        while (eq.next()) {
            llm.add(new Materia(eq, 1));
        }

        return llm;

    }

    public boolean verificoDependenciasMateria(Materia ma) throws SQLException {
        st = db.getStatement();
        String sql = "select * from apunte where apunte.materia_idmateria = " + ma.getIdmateria() + " ";
        System.out.println(sql);
        ResultSet eq = st.executeQuery(sql);



        if (eq.next() == true) {
            int dialog = JOptionPane.showConfirmDialog(null, "Esta materia contiende dependencias y no puede ser borrada, desea ver las dependencias ?");

            switch (dialog) {

                case 0:

                    verDependenciasMateria(ma);

                    break;
                case 1:
                    break;
                case 2:
                    break;

            }





            return true;

        } else {


            return false;
        }



    }

    private void verDependenciasMateria(Materia ma) throws SQLException {
        st = db.getStatement();

        String sql = "select * from apunte where apunte.materia_idmateria = " + ma.getIdmateria() + " ";
        ResultSet eq = st.executeQuery(sql);
        String resultado = "";
        JOptionPane.showMessageDialog(null, "pase");

        LinkedList<Apunte> lla = new LinkedList();

        while (eq.next()) {

            lla.add(new Apunte(eq, 1));

        }

        new eliminarApunte(lla);




    }

    public void eliminarMateria(Materia ma) throws SQLException {
        st = db.getStatement();

        String sql = "delete from materia where materia.idmateria = " + ma.getIdmateria() + " ";
        st.execute(sql);




    }

    //profesor
    public boolean verificoDependenciasProfesor(Profesor pr) throws SQLException {
        st = db.getStatement();
        String sql = "select * from profesor p, profesor_has_apunte pha where p.idprofesor = " + pr.getIdprofesor() + " and pha.profesor_idprofesor = p.idprofesor";
        ResultSet eq = st.executeQuery(sql);


        if (eq.next() == true) {
            int dialog = JOptionPane.showConfirmDialog(null, "Este profesor contiende dependencias y no puede ser borrada, desea ver las dependencias ?");

            switch (dialog) {

                case 0:

                    verDependenciasProfesor(pr);

                    break;
                case 1:
                    break;
                case 2:
                    break;

            }





            return true;

        } else {


            return false;
        }



    }

    private void verDependenciasProfesor(Profesor pr) throws SQLException {

        st = db.getStatement();
        String sql = " select * from profesor_has_apunte pha, apunte ap where pha.profesor_idprofesor = " + pr.getIdprofesor() + " and pha.apunte_identificador = ap.idapunte ";
        ResultSet eq = st.executeQuery(sql);
        LinkedList<Apunte> llp = new LinkedList();
        String resultado = "";
        while (eq.next()) {

            llp.add(new Apunte(eq, 1));
        }
        new eliminarApunte(llp);


    }

    public void eliminarProfesor(Profesor pr) throws SQLException {


        st = db.getStatement();

        String sql = "delete from profesor where idprofesor = " + pr.getIdprofesor() + " ";
        st.execute(sql);


    }
//apuntes

    public LinkedList<Apunte> traerApuntes() throws SQLException {

        LinkedList<Apunte> lla = new LinkedList();
        st = db.getStatement();
        String sql = "select * from apunte order by idapunte";
        ResultSet eq = st.executeQuery(sql);

        while (eq.next()) {

            lla.add(new Apunte(eq, 1));



        }

        return lla;




    }

    public LinkedList<Apunte> crearApunte(int id) throws SQLException {

        
        LinkedList<Apunte> apu = new LinkedList();
        st = db.getStatement();
        String sql = "select * from apunte where id ="+id+"";
        ResultSet eq = st.executeQuery(sql);
        
         
                

        while (eq.next()) {
            apu.add(new Apunte(eq.getInt("idapunte"), eq.getString("nombreApunte"), eq.getString("tema"), eq.getString("letra"), eq.getString("anio"), eq.getInt("cantidad"), eq.getString("ubicacion"), eq.getString("precio"), eq.getString("descripcion"), eq.getString("tags"), new Materia(eq.getInt("idmateria"), eq.getString("nombreMateria"), eq.getString("jefeDeCatedra"))));

        }




        for (int i = 0; i < apu.size(); i++) {

            eq = st.executeQuery("select * from profesor_has_apunte pha, profesor p where pha.apunte_identificador = " + ap.get(i).getIdapunte() + " and pha.profesor_idprofesor = p.idprofesor ");
            while (eq.next()) {

                apu.get(i).setProfesor(new Profesor(eq.getInt("idprofesor"), eq.getString("nombreProfesor"), eq.getString("apellido"), eq.getString("mail"), eq.getString("direccion"), eq.getInt("telefono")));
            }

        }

        for (int i = 0; i < apu.size(); i++) {


            eq = st.executeQuery("select * from carrera_has_apunte cha, carrera c where cha.apunte_identificador = " + ap.get(i).getIdapunte() + " and cha.carrera_idcarrera = c.idcarrera ");

            while (eq.next()) {

                apu.get(i).setCarrera(new Carrera(eq.getInt("idcarrera"), eq.getString("nombreCarrera"), eq.getString("jefeDeDepartamento")));


            }

        }




        return apu;


    }

    public void guardarProfesor(LinkedList<Profesor> pr1) throws SQLException {
        
        for (int i = 0 ; i<pr1.size();i++){
        Profesor pr = pr1.get(i);
        st = db.getStatement();
        String sql = "Insert into profesor (idprofesor,nombreProfesor,apellido,mail,direccion,telefono) values (" + null + ",'" + pr.getNombre() + "','" + pr.getApellido() + "','" + pr.getMail() + "','" + pr.getDireccion() + "','" + pr.getTelefono() + "') ";
        System.out.println(sql);
        st.execute(sql);
        }
        
    }

    public void guardarCarrera(LinkedList<Carrera> car) throws SQLException {
        
        
        for ( int i = 0 ; i<car.size();i++){
            Carrera ca = car.get(i);
        st = db.getStatement();
        String sql = "insert into carrera (idcarrera,nombreCarrera,jefeDeDepartamento) values (" + null + ",'" + ca.getNombreCarrera() + "','" + ca.getJefeDeDepartamento() + "')";
        st.execute(sql);
        }
    }
}
